import { FlightTime } from '../flight/interfaces/flight.interface';

/**
 * 解析时间字符串，并根据末尾的加减号调整时间，返回对应的Date对象。
 *
 * @param timeStr 时间字符串，可能包含末尾的加号（+）或减号（-）来表示时间的增减。
 * @param dateStr 日期字符串，用于与时间字符串结合生成完整的日期时间。
 * @returns 返回一个Date对象，该对象表示根据加减号调整后的日期时间。
 */
export const parseTimeStr = (timeStr: string, dateStr: string): Date | null => {
  // 正则表达式匹配末尾的所有加号或减号
  if (timeStr.trim() === '') return null;
  const deltaMatch = timeStr.match(/[+\-]+$/g);
  let delta = 0;
  if (deltaMatch) {
    // 取匹配到的第一个结果（因为末尾的加减号是连续的）
    const symbols = deltaMatch[0];
    // 计算加号或减号的数量
    delta = symbols.split('').reduce((acc, curr) => {
      return curr === '+' ? acc + 1 : acc - 1;
    }, 0);
    // 移除时间字符串中的加号或减号
    timeStr = timeStr.replace(/[+\-]+$/g, '');
  }
  const adjustedDate = new Date(dateStr);
  adjustedDate.setDate(adjustedDate.getDate() + +delta);
  // 解析 timePart 字符串为小时和分钟
  const [hours, minutes] = timeStr.split(':').map(Number);
  // 设置小时和分钟
  adjustedDate.setHours(hours, minutes, 0, 0);
  return adjustedDate;
};

/**
 * 根据航班时间信息和航班类型（到达或出发）选择相应的时间
 * @param flightTime 航班时间信息，包含实际、预计和计划的到达和出发时间
 * @param isArrival 指示是否为到达航班的布尔值，true表示到达，false表示出发
 * @returns 返回选中的时间，如果没有可用时间，则返回一个默认日期
 */
export const chooseTime = (
  flightTime: FlightTime,
  isArrival: boolean,
): Date | null => {
  // 根据isArrival参数决定选择到达时间还是出发时间
  if (isArrival) {
    // 优先选择实际到达时间，如果有值则返回
    if (flightTime.actArrTime !== null) return flightTime.actArrTime;
    // 如果没有实际到达时间，尝试选择预计到达时间
    if (flightTime.estArrTime !== null) return flightTime.estArrTime;
    // 如果没有预计到达时间，尝试选择计划到达时间
    if (flightTime.skdArrTime !== null) return flightTime.skdArrTime;
  } else {
    if (flightTime.actDepTime !== null) return flightTime.actDepTime;
    if (flightTime.estDepTime !== null) return flightTime.estDepTime;
    if (flightTime.skdDepTime !== null) return flightTime.skdDepTime;
  }
};
